#include "GY_LineEditDelegate.h"
#include <QDebug>

GY_LineEditDelegate::GY_LineEditDelegate(QObject *parent)
    :QItemDelegate(parent)
{

}

void GY_LineEditDelegate::setIndexRegExpValidator(const int row, const int column,const QString &rx)
{
    m_index.insert(row,column);
    if(rx==nullptr) //如果是空，则设置初始状态位int型
    {
        m_indexRegExp.insert(row,"int");
    }
    else
    {
        m_indexRegExp.insert(row,rx);
    }
}

/**
 * @brief createEditor 创建下拉框控件
 * @param parent 父对象
 * @param option 位置
 * @param index 索引
 * @return
 */
QWidget *GY_LineEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(m_index.contains(index.row()))
    {
        QLineEdit *editor = new QLineEdit(parent);
        QString typeStr = m_indexRegExp.value(index.row());
        if(typeStr=="int") //整数型
        {
            editor->setValidator(new QIntValidator(parent)); //限制只能输入整数
        }
        else if(typeStr.contains("double")) //小数型
        {
            int floatNum;
            QRegExp regExp("(\\d+)"); //匹配数字
            int pos = 0;
            while ((pos = regExp.indexIn(typeStr,pos))!= -1) {
                floatNum = regExp.cap(0).toInt();
                pos += regExp.matchedLength();
            }

            QDoubleValidator* pdoubleVal = new QDoubleValidator(parent);
            pdoubleVal->setDecimals(floatNum); //设置小数位数
            editor->setValidator(pdoubleVal); //限制只能输入小数
        }
        else //正则表达式
        {
            QRegExp regExp(typeStr); //只能输入数字、小数点以及符号
            editor->setValidator(new QRegExpValidator(QRegExp(regExp)));
        }
        return editor;

    }
    else if (m_index.isEmpty()) //如果没有设置位置
    {

    }


}

/**
 * @brief setEditorData 编辑的时候设置数据到上面的editor中
 * @param editor 控件
 * @param index 索引
 */
void GY_LineEditDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString text = index.model()->data(index, Qt::EditRole).toString();
//        QString str = QString::number(text.toFloat(),'f',4);
    QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
    lineEdit->setText(text);
}

/**
 * @brief setModelData 编辑完成，保存数据到data
 * @param editor 控件
 * @param model 模型
 * @param index 索引
 */
void GY_LineEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
//        QString text = QString::number(lineEdit->text().toFloat(),'f',4);
    model->setData(index, lineEdit->text(), Qt::EditRole);
}

/**
 * @brief updateEditorGeometry 设置控件的位置和大小，样式等
 * @param editor 控件
 * @param option 位置
 * @param index 索引
 */
void GY_LineEditDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}
